package io.gatling.extensions.common.check

import io.gatling.core.check.{Check, CheckBuilder, CheckMaterializer, FindCheckBuilder, ValidatorCheckBuilder}

import scala.annotation.implicitNotFound

// R: Response - 原生的结果
// T: Check type, only used for CheckMaterializer Type Class - 不知道有什么卵用
// P: Prepared - P 是对 R 数据进行处理后的数据（如果不需要处理的话，P 和 R 可以用一样的）
// X: Extracted - 提取的结果类型，比如：提取结果 P 中关注的某个结果，可以是数据库操作影响行数的，提取的值即为 X

// 提供隐式转换函数（混合在 Predef 中，提供全局的隐式转换：将各种类型的 CheckBuilder 转换成 Check）
// 注意：将 CheckBuilder 转为 Check 还需要准备 CheckMaterializer，放在具体的 Support 中
trait CommonCheckSupport {

  /** 将CheckBuilder转换为UpdateResultCheck类型，比如bodyString.is("")就是CheckBuilder类型的 * */
  @implicitNotFound("Could not find a CheckMaterializer. This check might not be valid for this scenes.")
  implicit def checkBuilder2Check[T, P, X, C <: Check[R], R](checkBuilder: CheckBuilder[T, P, X])(implicit materializer: CheckMaterializer[T, C, R, P]): C = checkBuilder.build(materializer)


  /** 将ValidatorCheckBuilder转换为UpdateResultCheck类型 * */
  @implicitNotFound("Could not find a CheckMaterializer. This check might not be valid for this scenes.")
  implicit def validatorCheckBuilder2Check[T, P, X, C <: Check[R], R](validatorCheckBuilder: ValidatorCheckBuilder[T, P, X])(implicit materializer: CheckMaterializer[T, C, R, P]): C = validatorCheckBuilder.exists


  /** 将FindCheckBuilder转换为UpdateResultCheck类型 * */
  @implicitNotFound("Could not find a CheckMaterializer. This check might not be valid for this scenes.")
  implicit def findCheckBuilder2Check[T, P, X, C <: Check[R], R](findCheckBuilder: FindCheckBuilder[T, P, X])(implicit materializer: CheckMaterializer[T, C, R, P]): C = findCheckBuilder.find.exists
}
